package com.probiz.estore.product.dao.impl;

import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Set;

import com.probiz.estore.common.model.product.SkuOptionValue;
import com.probiz.estore.common.model.product.SkuOption;
import com.probiz.estore.core.dao.impl.HibernateGenericDaoImpl;
import com.probiz.estore.product.dao.SkuOptionValueDao;

/**
 * Dao implementation for SkuOptionValue.
*/
public class SkuOptionValueDaoImpl extends HibernateGenericDaoImpl<SkuOptionValue> implements SkuOptionValueDao {

	@SuppressWarnings("unchecked")
	public List<SkuOptionValue> findSkuOptionValueByOptionCodeAndValueName(
			String optionCode, String valueName) {
		String hql="select sov from SkuOptionValue sov where sov.skuOption.skuOptionCode=? and sov.skuOptionValueName=?";
		List<SkuOptionValue>result =findByHql(hql, new Object[]{optionCode,valueName});
		return result;
	}

    @SuppressWarnings("unchecked")
	public List<SkuOptionValue> findSkuOptionValueByOptionNameAndValueName(
			String optionName, String valueName) {
		String hql="select sov from SkuOptionValue sov where sov.skuOption.skuOptionName=? and sov.skuOptionValueName=?";
		List<SkuOptionValue>result =findByHql(hql, new Object[]{optionName,valueName});
		return result;
	}

    public List<String> saveSkuOptionValuesFromArrays(SkuOption skuOption, String[] ids,String[] names, String[] types, String[] values) {
        List<String> newSkuOptionValueIdList = new ArrayList<String>();
		//删除规格值
		List<String> skuOptionValueIdList= Arrays.asList(ids);
		Set<SkuOptionValue> formerSkuOptionValueList=skuOption.getSkuOptionValues();//原来的规格值
		for (SkuOptionValue skuOptionValue : formerSkuOptionValueList) {
			if(!skuOptionValueIdList.contains(skuOptionValue.getSkuOptionValueId().toString())){
				Long size = getSizeOfProductSkuOptionValue(skuOptionValue.getSkuOptionValueId());
				if(size == 0){
					//只有规格值不关联商品才允许删除，这里做个检查以防万一。
					delete(skuOptionValue);
				}else{
					//不提交“不允许删除信息”也可，因为几乎不会出现该情况。
				}
			}
		}
		//增加或者修改规格值
		for (int i = 0; i < ids.length; i++) {
			SkuOptionValue skuOptionValue;
			if(ids[i].equals("")){
				//case:新增
				skuOptionValue = new SkuOptionValue();
			}else{
				//case:修改
				skuOptionValue = getById(Integer.valueOf(ids[i]));
			}
			skuOptionValue.setSkuOptionValueName(names[i]);
			skuOptionValue.setSkuOptionValueType(new Short(types[i]));
			skuOptionValue.setSkuOptionValue(values[i]);
			skuOptionValue.setSortOrder(i);
			skuOptionValue.setSkuOption(skuOption);
			save(skuOptionValue);
			newSkuOptionValueIdList.add(skuOptionValue.getSkuOptionValueId().toString());
		}
		return newSkuOptionValueIdList;
    }
    
	public Long getSizeOfProductSkuOptionValue(Integer skuOptionValueId){
		return this.countByHql("select count(o.productSkuOptionValueId) from ProductSkuOptionValue o where o.skuOptionValue.skuOptionValueId=?", skuOptionValueId);
	}


}
